package com.situ.service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.TreeSet;

import com.situ.domain.FruitModel;
import com.situ.domain.ImportBillModel;
import com.situ.domain.SalesRecordModel;

public class FruitService implements Serializable{
    
    /** serialVersionUID*/  
    private static final long serialVersionUID = 1161616164L;
    
    TreeSet<FruitModel> fruitSet = new TreeSet<FruitModel>();

    public TreeSet<FruitModel> listFruit() {
        return fruitSet;
    }
    
    
    public FruitService() {
        super();
        fruitSet.add(new FruitModel("苹果"));
        fruitSet.add(new FruitModel("桃子"));
        fruitSet.add(new FruitModel("西瓜"));
    }
    
    /**
     * <p>Title: addFruit</p>  
     * <p>Description: 新增水果</p>  
     * @author 恩策
     * @date 2021年7月28日
     * @param n
     */
    public void addFruit(String n) {
        fruitSet.add(new FruitModel(n));
    }
    
    /**
     * <p>Title: sold</p>  
     * <p>Description: 销售水果</p>  
     * @author 恩策
     * @date 2021年7月29日
     * @param SR
     */
    public void sold(SalesRecordModel SR) {
        // 销售记录里的水果
        for (int i = 0; i < SR.getName().length; i++) {
            // 水果列表
            for (FruitModel fruit : fruitSet) {
                if (fruit.getName().equals(SR.getName()[i])) {
                    // 更新水果列表,收入
                    goodsOutC(fruit, SR, i);
                    break;
                }
            }
            
            
        }
    }
    
    
    /**
     * <p>Title: getTop</p>  
     * <p>Description: 排序,获得销售量Top3</p>  
     * @author 恩策
     * @return 
     * @date 2021年7月30日
     */
    public FruitModel[] getTop() {
        FruitModel[] top3 = { new FruitModel("苹果"), new FruitModel("桃子"), new FruitModel("西瓜") };
        FruitModel temp;
        for (FruitModel fruit : fruitSet) {
            if (fruit.getTotleSellOut() > top3[2].getTotleSellOut()) {
                top3[2] = fruit;
            }
            if (top3[2].getTotleSellOut() > top3[1].getTotleSellOut()) {
                temp = top3[1];
                top3[1] = top3[2];
                top3[2] = temp;
            } 
            if (top3[1].getTotleSellOut() > top3[0].getTotleSellOut()) {
                temp = top3[0];
                top3[0] = top3[1];
                top3[1] = temp;
            }
        }
     return top3;
       
    }
    
    /**
     * <p>Title: goodsIn</p>  
     * <p>Description: 进货,更新水果列表数据</p>  
     * @author 恩策
     * @date 2021年7月28日
     * @param 进货单
     */
    public void goodsIn(ImportBillModel IB) {
        boolean flag = true;
        // 进货单里的水果数量
        int num = IB.getNames().length;
        // 对水果列表里的数据更新
        for (FruitModel fruit : fruitSet) {
            for (int i = 0; i < num; i++) {
                if (fruit.getName().equals(IB.getNames()[i])) {
                    // 更新水果列表
                    goodsInC(fruit, IB, i);
                    break;
                }
            }
            
        }
        // 向水果列表中插入进货单里可能存在的新水果
        for (int i = 0; i < num; i++) {
            // 默认该水果是新加入的
            flag = true;
            for (FruitModel fruit : fruitSet) {
                if (fruit.getName().equals(IB.getNames()[i])) {
                    // 该水果不是新增的，遍历进货单里的下一个
                    flag = false;
                    break;
                }
            }
            // 该水果确实是新增的
            if(flag) {
                fruitSet.add(new FruitModel(IB.getNames()[i]));
                for (FruitModel fruit : fruitSet) {
                    if (fruit.getName().equals(IB.getNames()[i])) {
                        // 更新水果列表
                        goodsInC(fruit, IB, i);
                        break;
                    }
                }
            }
        }

    }
    
    /*
     * 依据销售记录单更新水果列表
     */
    private void goodsOutC (FruitModel fruit, SalesRecordModel SR, int i){
        double cost = SR.getCosts()[i];
        // 库存是否充足
        try {
            if (SR.getWeight()[i] <= fruit.getStock()) {
                // 累计销售该水果数量
                fruit.setTotleSellOut(SR.getWeight()[i]);
            } else {
                throw new FruitException(fruit.getName() + "库存不足。\n 顾客购买" + fruit.getName() + SR.getWeight()[i] + "kg"
                        + "\n库存剩余" + fruit.getStock() + "kg");
            }
        } catch (FruitException e) {
            System.out.println(e.getMessage());
            return;
        }
        // 累计销售该水果收入
        // 女性打八折
        if (SR.getSex() == 0) {
            cost *= 0.8;
        }
        // 17.00之后打五折
        if (SR.getDate().getHours() >= 17) {
            cost *= 0.5;
        }
        fruit.setTotleSellOutFunds(cost);
        // 该水果库存
        fruit.setStock(fruit.getStock() - SR.getWeight()[i]);
    }
    
    /*
     * 依据进货单更新水果列表
     */
    private void goodsInC (FruitModel fruit, ImportBillModel IB,int i) {
        // 进价
        fruit.setCostPrice(IB.getCostPrices()[i]);
        // 累计进货该水果数量
        fruit.setTotleComeIn(IB.getComeIns()[i]);
        // 累计进货该水果费用
        fruit.setTotleComeInFunds(IB.getComeInCosts()[i]);
        // 该水果库存
        fruit.setStock(fruit.getStock() + IB.getComeIns()[i]);
    }
    
    
    /**
     * <p>Title: setSellingPrice</p>  
     * <p>Description: 设置水果的售价</p>  
     * @author 恩策
     * @date 2021年7月28日
     * @param name
     * @param sellingPrice
     * @return
     */
    public boolean setSellingPrice(String name, double sellingPrice) {
        for (FruitModel fruit : fruitSet) {
            if (fruit.getName().equals(name)) {
                fruit.setSellingPrice(sellingPrice);
                return true;
            }
        }
        return false;
    }

}
